package AccesoADatos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import Logica.Entidades.EquipoDeFantasia;
import Logica.Entidades.Formacion;
import Logica.Entidades.Jugador;

public class FormacionDAO {

	public void guardarFormacion(Formacion f, String nombreEquipo,int nroFecha){
		
		List<Jugador> titulares = f.getTitulares();
		List<Jugador> suplentes = f.getSuplentes();
		int idFormacion = getIdFormacionMax() + 1;
		String consulta = "INSERT INTO FORMACION VALUES("+idFormacion+","+f.getPuntaje()+","+f.getTransferencias()+",'"+nombreEquipo+"',"+nroFecha+")";
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			Statement stmt = conn.createStatement();
            stmt.executeQuery(consulta);
            for(Jugador j: titulares){
            	consulta = "INSERT INTO JUGADORES_TITULARES VALUES("+j.getId()+","+idFormacion+")";
            	stmt.executeQuery(consulta);
            }
            for(Jugador j: suplentes){
            	consulta = "INSERT INTO JUGADORES_SUPLENTES VALUES("+j.getId()+","+idFormacion+")";
            	stmt.executeQuery(consulta);
            }
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public int getIdFormacionMax(){
		String consulta = "SELECT MAX(ID_FORMACION) FROM FORMACION";
		List<List<String>> resultado = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			resultado = resultSetToString(rset,2);
            
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		String maxIdFormacion = resultado.get(0).get(0);
		int maxId;
		if(maxIdFormacion == null)
			maxId=0;
		else
			maxId = (new Integer(maxIdFormacion)).intValue();
		return maxId;
	}
	
	public List<List<String>> buscarFormacion(EquipoDeFantasia e, int numeroFecha){
		String consulta = "SELECT * FROM FORMACION WHERE NOMBRE_EQUIPO = '"+e.getNombre()+"' AND NRO_FECHA = "+numeroFecha+"";

		List<List<String>> resultado = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			resultado = resultSetToString(rset,6);
            
			stmt.close();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		return resultado;
	}
	
	public List<List<String>> resultSetToString(ResultSet r, int columnas) throws SQLException{
		
		List<List<String>> lista = new ArrayList<List<String>>();
		
		while(r.next()){
			
			List<String> temp = new ArrayList<String>();
			
			for(int i = 1 ; i < columnas ; i++){
				temp.add(r.getString(i));
			}
			lista.add(temp);
		}
		
		return lista;
	}

	public List<List<String>> obtenerFormacionActual(String nombreEquipoFantasia, int nroFecha) {
		List<List<String>> formacionActualDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			String consulta = "SELECT F.* FROM EQUIPO_FANTASIA E, FORMACION F WHERE E.NOMBRE = F.NOMBRE_EQUIPO AND E.NOMBRE = '" + nombreEquipoFantasia + "' AND NRO_FECHA = " + nroFecha;
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
            
            formacionActualDto = resultSetToString(rset,6);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return formacionActualDto;
		
		
	}

	public void crearFormacion(int ultimoIdFormacion, String nombreEquipoFantasia, int nroFecha) {
		int proximoIdFormacion = ultimoIdFormacion + 1;
		int proximoNroFecha = nroFecha + 1;
		
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			String consulta = "INSERT INTO FORMACION VALUES (" + proximoIdFormacion + ",0,3,'" + nombreEquipoFantasia + "'," + proximoNroFecha + ")";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
            
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void clonarFormacionParaFechaSiguiente(Formacion formacion, String nombreEquipoFantasia, int nroFecha) {
		
		List<Jugador> titulares = formacion.getTitulares();
		List<Jugador> suplentes = formacion.getSuplentes();
		int idFormacion = getIdFormacionMax() + 1;
		String consulta = "INSERT INTO FORMACION VALUES("+idFormacion+",0,"+formacion.getTransferencias()+",'"+nombreEquipoFantasia+"',"+nroFecha+")";
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			Statement stmt = conn.createStatement();
            stmt.executeQuery(consulta);
            for(Jugador j: titulares){
            	consulta = "INSERT INTO JUGADORES_TITULARES VALUES("+j.getId()+","+idFormacion+")";
            	stmt.executeQuery(consulta);
            }
            for(Jugador j: suplentes){
            	consulta = "INSERT INTO JUGADORES_SUPLENTES VALUES("+j.getId()+","+idFormacion+")";
            	stmt.executeQuery(consulta);
            }
            
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void guardarPuntajeFormacion(String nombreEquipoFantasia, int nroFecha, int puntaje) {
		
		String consulta = "UPDATE FORMACION SET PUNTAJE = "+ puntaje + " WHERE NOMBRE_EQUIPO = '"+ nombreEquipoFantasia +"' AND NRO_FECHA = " + nroFecha;
         try {
                 Connection conn = ConexionOracle.getConexionOracle().getConnection();
                 Statement stmt = conn.createStatement();
     stmt.executeQuery(consulta);
     
                 stmt.close();
         } catch (SQLException e) {
                 e.printStackTrace();
         }
		
	}
}
